package com.condominio.backbean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;

import com.condominio.facade.Facade;
import com.condominio.model.Conta;
import com.condominio.model.Pessoa;
//fixing:a visao ta se atualizando com a sessao, nao com o banco verificar mais tarde.
public class ContaBean {

	private Conta conta=new Conta();
	private Conta contaRow=new Conta();
	private Facade fachada=Facade.getInstance();
	private List<Conta> listaContas=new ArrayList();
	//getters and setters
	public Conta getConta() {
		return conta;
	}
	public void setConta(Conta conta) {
		this.conta = conta;
	}

	public List<Conta> getListaContas() {
		return this.listaContas;
	}

	public void setListaContas(List<Conta> listaContas) {
		this.listaContas = listaContas;
	}
	//metodos especificos

	public Conta getContaRow() {
		return contaRow;
	}
	public void setContaRow(Conta contaRow) {
		this.contaRow = contaRow;
	}
	public List<Conta> getListaContasByLogado(){
		HttpSession s=(HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(true);
		if(!s.isNew()){
			try{
				Pessoa logado=(Pessoa)s.getAttribute("logado");
				List<Conta> conts=fachada.findAllContaByPessoa(logado);
				logado.setContas(conts);
				s.setAttribute("logado", logado);
				return conts;
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
		return new ArrayList<Conta>();
	}
	
	//crud
	public String cadastrarConta(){
		List<Conta> contas=fachada.findAllContaByTituloAndData(getConta());
		if(!contas.isEmpty()){
			return "erro";
		}
		if(!this.setarContas())
			return "erro";

		atualizaVisao();
		return "sucesso";

	}
	public void excluirAllContaActionListener(ActionEvent event){
		conta=(Conta)event.getComponent().getAttributes().get("contaRow");
		List<Conta> contas=fachada.findAllContaByTituloAndData(getConta());
		if(contas.isEmpty()){
			return;
		}
		List<Conta> helper=new ArrayList<Conta>();
		for(Conta c:contas){
			if(c.getStatus()) return;
			helper.add(c);
		}
		for(Conta c:helper){
			Pessoa p=c.getPessoa();
			p.removeContaByConta(c);
			c.setPessoa(null);
			fachada.excluirConta(c);
			fachada.atualizarPessoa(p);
		}
		atualizaVisao();

	}
	public void atualizarAllContaActionListener(ActionEvent event){
		conta=(Conta)event.getComponent().getAttributes().get("contaRow");
		System.out.println(conta.toString());
		if(contaRow!=null)
			System.out.println(contaRow.toString());
		contaRow=new Conta();
		contaRow.setId(conta.getId());
		contaRow.setNome((conta.getNome()));
		contaRow.setDataVencimento((conta.getDataVencimento()));
		contaRow.setStatus(conta.getStatus());
		contaRow.setPessoa(conta.getPessoa());
		System.out.println(conta.toString());
		System.out.println(contaRow.toString());
	}

	public void atualizarContas(){
		//primeira parte: conferir se existe contas no BD com contaRow
		List<Conta> contasRow=fachada.findAllContaByTituloAndData(getContaRow());
		if(contasRow.isEmpty()){
			atualizaVisao();
			return;
		}
		//segunda parte:verificar se tem alguma conta ja paga(da conta atual)
		for(Conta c:contasRow)
			if(c.getStatus()){ 
				atualizaVisao();

				return;
			}
		//terceira parte:se todas as contas com os parametros antigos axadas,
		//forem nao pagas, pegar contas com o novo parametro no BD, pra ver se 
		//existe alguma conta com os parametros ja passados
		List<Conta> contas=fachada.findAllContaByTituloAndData(getConta());
		if(!contas.isEmpty()){
			atualizaVisao();

			return;
		}
		//quarta parte:atualizar valores do banco
		for(Conta c:contasRow){
			c.setDataVencimento(conta.getDataVencimento());
			c.setNome(conta.getNome());
			c.setValor(conta.getValor());
			fachada.atualizarConta(c);
		}
		atualizaVisao();

	}


	public void atualizaVisao() {
		this.conta=new Conta();
	}



	/*private int contasAPagar(){
		HttpSession s=(HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false);
		Pessoa p=(Pessoa)s.getAttribute("Usuario");
		List<Conta> pes=fachada.findAllContaByPessoa(p);
		return pes.size();
	}*/

	//metodo pra setar as contas e alterar todos os usuarios
	private boolean setarContas(){
		List<Pessoa> pes=fachada.findAllPessoa();
		for(Pessoa p:pes){
			try{
				Conta c=this.getConta();
				c.setId(0);
				c.setPessoa(p);
				p.addConta(c);
				System.out.println(this.getConta().getPessoa().getNome());
				System.out.println("teste 1:"+c.getPessoa().getNome());
				System.out.println("teste 2:"+c.getPessoa().getContas().get(0));
				System.out.println("teste 3:"+p.getContas().get(0));
				System.out.println("apos setagem b:"+p.getContas().get(0).getPessoa().getNome());
				fachada.atualizarPessoa(p);
			}catch(Exception e){
				e.printStackTrace();
				return false;
			}

		}
		return true;
	}
	public void pagarContaActionListener(ActionEvent event){
		conta=(Conta)event.getComponent().getAttributes().get("contaRow");
		conta.setStatus(true);	
		fachada.atualizarConta(getConta());
		atualizaVisao();

	}


}
